经验分享:编写简易的温度监控程序(2)

(承接上回的blog)

读取传感器温度

本人使用的是 ds18b20 型数字温度传感器,一个刚出厂的此类传感器接入树莓派,并写入驱动程序之后,就可以正常地去测量树莓派周围的气温了。所记录的气温会通过ASCII字符串的形式输入到一个特定的文件里面,并且环境气温一旦变化,此文件的内容也会相应改变…

上述就是 ds18b20 记录温度的原理,既然温度是以字符串的形式记录在特定文件里面,那么就可以通过Linux C 中文件I/O的相关系统调用,来进行温度的读取。

一般来说,绝大多数ds18b20 型温度传感器接入树莓派之后,记录温度的文件共同包含的路径是 “/sys/bus/w1/devices/”,但由于各个传感器的芯片序列号不同,之后的文件路径就会有差异,但都是具有“28-”开头的文件夹名称,在“28-XXX”这个文件夹里面,就有记录温度的文件“w1_slave”。

打开文件“w1_slave” 之后,可以发现里面有循环冗余校验的标志“CRC”和其他一些代表特定字符的8进制ASCII码,最后"t="的部分,才是传感器所测量到的当前温度数据,此数据是真实值扩大1000倍之后的结果,所以真正发送给客户端的数据就应该在此基础上除以1000。

基于上述四段内容的描述,可以总结出获取温度的方法:

  1. 先利用Linux中的系统调用opendir,定位到共有的文件路径下(“/sys/bus/w1/devices/”);
  2. 在共有的文件路径之下,调用readdir找到文件名是“28-”开头的文件夹,并打开此文件夹中的文件“w1_slave”;
  3. 对文件“w1_slave”进行读取,并用相关的字符串处理函数截取到温度的字符串形式;
  4. 将第三步得到的字符串转化为浮点数,之后将该浮点数除以1000,此时该浮点数就是传感器所测量温度的真实值了。

发送温度数据给客户端

此过程与上回blog中所讲述的方法类似,仍然是使用简易的Unix socket网络编程来实现。上一步获得的温度数据是浮点型变量,而通过socket发送给客户端的数据是字节型的数据包,此时就应该把浮点型变量回转为字符串,之后才可以对服务器端接收到的客户端描述符进行写。

按照socket编程的基本模式,类似的服务器端socket程序可以概括为一下步骤:

  1. 先调用socket函数,创建服务器端的问价描述符;
  2. 调用bind函数,绑定服务器端的端口;
  3. 调用listen函数,监听端口,等待客户端来连接服务器,服务器未收到客户端的连接时,处于阻塞的状态;
  4. 当有客户端连接上服务器时,调用accept函数获取到客户端文件描述符;
  5. 对获取到的客户端文件描述符进行读写操作。

通过以上的方法,就可以正常的将温度数据通过字符串的形式发送给客户端。

此篇blog已解决了服务器端获取温度数据,并将数据发送给客户端的问题。下一篇blog将讲述如何将温度数据写入sqlite3,以及服务器端程序某些细节问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值