質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

1回答

1572閲覧

C言語のプログラムを修正する場合について

MountDown

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

0クリップ

投稿2020/06/11 02:43

C言語について全く知識が無いところでトラブル対応をせざるを得なくなってしまったので詳しい方ご教示いただけませんでしょうか。
(プログラム作成者が退職し連絡がつかない上にドキュメントが未整備
・・・(´;ω;`)ウゥゥ)

【トラブル】
・Raspberry Pi4⇔Azure IoT HubのMQTT通信が時々途切れる。
・Keep Aliveタイムの設定が短いのではないかと私は疑っている。

【仕様】
・Raspberry Pi4のデータをAzureにNode-REDを使ってアップロードしている
・MQTTで通信を行っている
・Raspberry Pi4にインストールされているmosquittoを動かすためにC言語で書かれたプログラムを探し当てた
・ディレクトリにExample.c、Example.o、Exampleといったプログラムがある

【推測】
Example.cのファイルを開こうとするとGeanyで開くことが確認できる。
ソースを書き換えてコンパイルをするとExample.o?Example?といったファイルが出来る?
このような対応で設定値を変えれるのではないかと推測している。
ただし、コンパイルを実施するとエラーが発生する

【エラー】

gcc -Wall -c "Example.c"(ディレクトリ: /var/iot/MQTT) Example.c:11:20: fatal error: comlib.h: そのようなファイルやディレクトリはありません #include <comlib.h> ^ compilation terminated. コンパイル失敗

ここまで、調べながら推測しながらやってきて行き詰ってしまいました。
これらの推測は間違っていないものでしょうか?
また、エラーや対応についてもアドバイスを頂けると嬉しいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/06/11 03:21 編集

Geanyのビルド→「ビルドコマンドの設定」や〜.geanyファイルに何か痕跡無いですか? 以前にGeany使ってなければ意味はないですが・・・
MountDown

2020/06/11 05:18

ありがとうございます。 頂いた情報をもとに調べてみたいと思います。
dodox86

2020/06/11 05:49

そもそもExample.c のソースコードとGeanyを開発環境に使っていたというのは確実なのでしょうか。(名前からしてExampleなので)Node-REDで何らかの既存の処理ノードが使われているなんてことはありませんか。引継ぎ資料も何もなく、C言語のご経験もなく、質問へのソースコードの提示もないので、失礼ながら質問者さんの思い込みを疑っています。
Kenji.Noguchi

2020/06/11 07:02

その#includeの行をコメントアウトしてコンパイルしたら未定義の関数のエラーが出るでしょうから、その情報を載せましょう。オープンソースならエラーメッセージから当該のファイル(ライブラリ)を探すことができるかもしれません。
MountDown

2020/06/11 07:36

includeの構文はライブラリを読み込むことなんだとなんとなく解釈しました。 findを使って全ディレクトリを検索したところ「/var/iot/common」のディレクトリ内にcomlib.hがありました。 コメントアウトしてみたところ、別のincludeのところで同じエラーとなりました。
Kenji.Noguchi

2020/06/11 07:45 編集

であればコメントアウトは元に戻してgcc -Wall -c "Example.c" -I/var/iot/common こうやってとりあえずコンパイルが通るところまで頑張ってください。次にリンカのエラーが出るでしょうから、find /var/iot -name "lib*"でライブラリを探して、リンカのエラーと見つかったライブラリの一覧を教えてください。
MountDown

2020/06/12 01:41

ありがとうございます。 gcc~をソースの中に記述してみましたがエラーが変わりませんでした・・・ あと、もともとのソースの中にgcc~の記述がないのですがエラーとして出るので???の状態です・・・
Kenji.Noguchi

2020/06/12 02:05

う〜ん、そう言う意味ではなかったのですが...。gccはコマンドラインで実行してください。-Iオプションが何をするものなのか、調べてみましょう。同じくライブラリとは何か、リンカーとは何か、hello worldをgccでコンパイルしてみるとか、基礎的な練習をしてから大きな問題を解決する方が結局は早いと思います。
FiroProchainezo

2020/06/12 02:32

そもそも質問なのですが、Azure IoTHubを使っているのにMosquittoをインストールしているのはなんででしょうか? エッジ側でもRaspberryPiに対してMQTT接続したいものがあるということでしょうか? また、MQTTの接続が切れるのは当たり前だと思うので、切断されたら再接続するように実装すれば良いのではと思うのですがいかがですか? C用のSDKでも利用しているのでしょうか? プログラムを調べる前に構成を調べた方がいいんじゃないかと思います。
MountDown

2020/06/15 06:17

>Kenji.Noguchiさん どえらい勘違いを私がしておりました。 概要はつかめましたが、おっしゃる通り基本的な箇所がダメなのでどういったものか勉強をします。
MountDown

2020/06/15 06:20

>FiroProchainezoさん エッジ側でもMQTTを使っています。 MQTTについてもまだ知識がなく手当たり次第にいろいろとやっていたのが現状です。 「切断されたら再接続」とのことですが、Node-RED上ではフローを再起動しない限り再接続されないのですが、MQTT側で何かできることはあるのでしょうか。
FiroProchainezo

2020/06/16 05:18

MQTTの再接続は、デバイス側で制御する必要があるはずです。 broker側ではどうにもならないと思います。 paho-mqttやAzure Device SDK(C)のようなものには再接続する機能があったはずです。 Node-REDのドキュメントをぱっと確認してみましたが、そういうような設定があるようには見えませんでした。 ご自身で開発する必要があるのではないでしょうか。 もしかしたら、keep-aliveを十分に長くした上で、定期的にpingを送れば解決するかもしれませんが、ping応答が無かった時に、切断されているから再接続してみるという処理が無いと、そのまま落ちるしかなくなりますね。
MountDown

2020/06/16 08:09

なるほど・・・ありがとうございます。 再接続に関する方法については、私もいろいろと調べてみましたが存在はしていないようですね。 Keep Aliveも長くするのが正しいのか・・・この辺にあまり文献もないようで・・・
FiroProchainezo

2020/06/16 08:54

別件でMQTTに苦労しました。 低速回線(SIMとか、ブツブツ切れる環境)を想定して作られているものなので仕方ないかなと諦めています。
guest

回答1

0

でているとおり、そのファイルがない、といってます。
まずはそのファイルがどこに有るのか探してみては

投稿2020/06/11 02:50

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MountDown

2020/06/11 05:18

ご回答ありがとうございます。 説明不足がありすみません。 当該箇所にファイルがあるにも関わらず、矛盾したエラーメッセージが出ているので悩んでおりました。
YT0014

2020/06/11 05:24

comlib.hは、どこにあったのですか?Example.cとは異なった場所にあるのが普通ですし、コンパイラの設定次第で、設置位置が変わるはずなんですが。
MountDown

2020/06/11 07:31

エラー解釈を読み間違えていました・・・ 「Example.c」が存在しないと勘違いしておりました。 「comlib.h」が存在しないよっていうエラーだったんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問