最近在开发BLE项目中用到了Http,本猿用的是C语言,FreeRTOS +M4核(很Low,大神可以直接忽略了),由于平台缘故,没有现成Http库可以使用,所以在TCP的协议上自己模拟Http协议。
组包Http协议之前,先翻看了一些资料,严重参考了《Http权威指南》(很多地方看不懂,呜呜......),本着边学便用原则,只看项目中用到的,我要实现功能是把BLE收集到的信息通过Http协议发送到服务器,然后检查http/1.x 200 ok...........;在一番抓耳挠骚之后终于组好了Http包,烧录程序试了一下,结果不出意料,不能运行,不仅没有http错误码返回,而且直接导致地层TCP连接也断开了(后来才知道对一些http错误,如果服务器不能正常识别为http,会直接断开),接这就是程序员的DEBUG模式,排除语法错误,确保TCP层把每个字符都发送出去了(这个用到了一个TCP&UDP小工具,非常好用,可以在本地调试TCP发送的每一个字符),然后逐个对比Http协议首部字段,没有发现错误;然后我又排除了服务器的因素,在网页上post数据(Http请求方法的一种)是有http/1.x 200 ok返回的,两端都做了排除,没有问题,所以问题最后还是回到了Http组包上..............(时间过了一周,没有新的进展,产品经理又过来催,心中那个风雨交加啊)。
无意中我在度娘上漫无目的建索有用的信息时,发现有人把Http的首部和载荷分割符写作“\n\n”,但是我记得这个分割应该是"\r\n"(CRLF行),于是司马当活马试了一下,当我把程序再次烧录后,我看到了等待已久http/1.x 200 ok(终于可以直面产品狗了....),在又增加了应用层代码后,终于顺利的完成了这个项目。
项目完成后,特意又确认了Http的首部和载荷分割符,定义确实是CRLF行,(我使用的编译器为MDK,在这个中集成开发环境中回车换行应该写作"\r\n",因为我经常使用RTT打印,所以这个很熟悉,这个在但是恰恰是这个局限了我的思维.........而且这个\r\n使用TCP&UDP小工具中是看不出来问题的,能看到是效果是http首部和载荷之间的确是换行显示了....),这个我觉得和编译器有关,编译器最终生成的二进制文件有关。
总结:总结一下就是,在组Http包时,Http的首部和载荷分割符在某些编译器中应该写作“\n\n”;已上是我自己实践得来的,不一定正确,如果有错误,还请多多指教。
好了,英格兰队马上要怼比利时,提前准备一下我的作案工具,回见!