Python向怎么向C语言传递结构体

Python016

Python向怎么向C语言传递结构体,第1张

况如下:

打算从Python发一个TCP数据包给远程服务器,数据的主体是一个C语言的 struct (较大,size 为1402)。由于这个struct太复杂,故不打算在python 处对其重新定义,目前的想法是用python调用一个C语言的模块,在这个模块中定义这个Struct,并设置好数据后,将其struct传回python中,再打包传送服务器。

但是不知道如何将这个struct 变量从C语言 传入Python中。尝试用Py_BuildValue函数,以Py_BuildValue("P",&interface_setup) //interface_setup为结构体变量

传递,

但是几次都得到运行时错误:

SystemError: bad format char passed to PyBuildVaule。

1.设备

这里用的是海康的鱼眼摄像头,型号是DS-2CD3955FWD-IWS,其实基本上能支持sdk二次开发的IP摄像头都可以(参考这里)。鱼眼摄像头相比普通的摄像头经过扭曲,因此在应用的时候一般需要进行反扭曲,这一步会造成比较大的延迟,因此没有不是特定需求的话尽量使用普通的就可以。

注:海康的萤石系列貌似并不能通过RTSP地址获取,而这里的方法需要用RTSP进行视频流获取,所以无法萤石系列就不在此列。

2.通过RTSP地址获取视频流

首先需要知道海康设备的RTSP地址,可以通过这里进行查看。

import cv2

source = ""rtsp://admin:[email protected]/Streaming/Channels/1"

注: admin和12345分别是ip camera的用户名和密码,在浏览器上第一次登录摄像头的时候会进行设置;

192.168.1.64是摄像头的默认IP,在浏览器中输入即可进入登录页面(如下);

Channels/1和Channels/2分别对应主码流和子码流地址,两者的分辨率不同。IP摄像头无法通过opencv调节分辨率,只能在海康的监控界面的配置进行设置(如下)。

3. 摄像头校准(calibration)(optional)

这个配置有很多,而且官方提供的校准文档很详细(戳这里),就不具体细讲了。需要python版本的代码的话可以直接fork这里;如果是c++版本的话可以参考这里

NETDEV_Init 初始化

NETDEV_Login_V30 ipc设备登录

NETDEV_QueryVideoChlDetailList 查询视频通道信息列表

NETDEV_CaptureNoPreview 设备抓图

使用restype 设置接收参数的类型

HIKSDK.NETDEV_Login_V30.restype = ctypes.c_void_p

假如不设置接收参数的类型,会抛出异常:内存地址不一致

指针类型作为返回值传递给python时,在未设置类型的时候,会发生默认截断的问题

sdk日志:

python日志:101200(用户不在线)

https://docs.python.org/3.6/library/ctypes.html#fundamental-data-types

http://icejoywoo.github.io/2018/12/10/intro-python-ctyps.html