k.sato
2024年6月17日 10時53分
佐藤と申します。
お世話になっております。
ABOSのalpineコンテナで開発をしております。
pythonで収集したデータをSNMPで読み出したく
ATDEにalpineコンテナを作成しnet-snmpをmakeしています。
pythonのメインとc言語のnet-snmp間はmmapでデータを共有しています。
お互いリトルエンディアンのときは正常に読めていたのですが、
下層に繋がる装置の関係でpythonの構造体をctypes.BigEndianStructureで定義したところ
SNMPでGETした値がおかしくなりました。
Makefile等でビッグエンディアンを指定してmakeすることはできるのでしょうか?
以上、よろしくお願い致します。
コメント
k.sato
古賀様
佐藤です。
回答ありがとうございます。
> mmap を使って Python アプリケーションと net-snmap の間で共有している領域に、ctypes.BigEndianStrucuture の内容を書き出していらっしゃる、ということかと思います。
> であれば、共有メモリ領域に書き出す前に、ctypes.BigEndianStructure の内容を ctypes.LittleEndianStructure を使ってリトルエンディアンに変換して、ctypes.LittleEndianStrucure の内容を書き出す、というのが解になるかと思います。
>
> これについては、以下の Blog 記事が参考になりそうです:
> https://veleno.hatenadiary.org/entry/2021/02/23/181824
>
> いかがでしょうか?もし参考になりましたら幸いです。
確かにその段階で変換すればよいですね。
python側でリトルエンディアンに変換することでSNMPから正常な値がGET出来るようになりました。
ありがとうございました。
at_shinya.koga
2024年6月17日 11時33分
アットマークテクノの古賀です。
佐藤さん:
>ABOSのalpineコンテナで開発をしております。
>pythonで収集したデータをSNMPで読み出したく
>ATDEにalpineコンテナを作成しnet-snmpをmakeしています。
>pythonのメインとc言語のnet-snmp間はmmapでデータを共有しています。
>
>お互いリトルエンディアンのときは正常に読めていたのですが、
>下層に繋がる装置の関係でpythonの構造体をctypes.BigEndianStructureで定義したところ
>SNMPでGETした値がおかしくなりました。
mmap を使って Python アプリケーションと net-snmap の間で共有している領域に、ctypes.BigEndianStrucuture の内容を書き出していらっしゃる、ということかと思います。
であれば、共有メモリ領域に書き出す前に、ctypes.BigEndianStructure の内容を ctypes.LittleEndianStructure を使ってリトルエンディアンに変換して、ctypes.LittleEndianStrucure の内容を書き出す、というのが解になるかと思います。
これについては、以下の Blog 記事が参考になりそうです:
https://veleno.hatenadiary.org/entry/2021/02/23/181824
いかがでしょうか?もし参考になりましたら幸いです。