用python編寫TCP Socket伺服器,C語言嵌入式工程師的玩法

2020-12-14 小扇子的筆記

背景:驗證設備遠程升級的協議方案可行性

其實是很簡單的一個處理過程,首先設備能夠聯網,與遠程伺服器建立連接,通過SOCKET建立雙向連接,為了保證通信可靠,採用TCP的方式。

下面具體描述逐步實現的過程。

首先、平臺方案確定

圖1、通信簡易拓撲

設備端:設備主MCU為STM32F103,外接一個4G模塊來中轉數據,4G模塊的通信接口為串口。

伺服器端:簡易起見,使用國內雲大廠--阿里雲,然後是伺服器開發語言的選擇。本來考慮採用基於C++的QT進行開發,因為C語言使用多年,已經習慣了基於C的各種開發工具。但是發現還有幾天時間,於是想到人工智慧很火的Python語言,要不試試寫下Python腳本。

圖2、Python語言

其次、環境安裝

因為網絡帶寬要求不高,阿里雲伺服器申請最便宜的、預訂一星期時間(省點錢),基於Window作業系統的(用習慣了),然後進行組策略配置,開放10000埠給TCP Server使用。

圖3、最便宜的ECS雲主機

下載Python3.x版本,現在的軟體安裝做得很人性化了,按下一步操作安裝,環境變量也給配置好了。

圖4、下載安裝最新版本Python3

然後、開始學習Python

整本書,花了2天時間認真學習了一下Python,初看其跟C語言很相似,細看好像又有些不同。

列幾個比較不習慣的差異。

1、變量類型就一個整數類型,沒有Char、Short類型區分,通過賦值給變量來確定類型,根據數值的位數自動決定數據類型。

intValue = 255 #char型

intValue += 2 #自動提升為short型

2、沒有數組,取而代之的是列表,列表的功能比數組更加強大

intList = [1,10,20,100] #列表定義

intList[0] = 2 #類似C語言數組的操作

intList.append(200) #列表可擴展

3、新增了字典類型((鍵:值)形式),看完後發現功能非常強大。

intDict = {0:10,1:20,2:30} #字典的定義

intDict[0] = 100 # 類似C語言數組的操作

重要的是:鍵(key)是不可變的,可以為字符串、數字類型;值(value)可以任意數字類型,這就是字典強大的地方

4、指針哪裡去了?把這討厭的指針給隱藏了。

接著、開始構思設計

對於設備端比較簡單,不做介紹。

對於伺服器端,採用多線程模塊化(模塊化是我的最愛)設計,如下設計結構。

圖5、伺服器端Python腳本軟體框架

主線程目前只用於創建子線程,沒其他用途;

Tcp Socket線程主要用於開啟Tcp伺服器監聽,專注於數據接收與發送;

Data Pro線程專注於根據實際的業務邏輯進行數據處理。

然後、編碼調試

因為代碼量小,Tcp Socket線程模塊與Data Pro線程模塊均放在一個文件內,如下代碼(親測可用);

圖6、導入模塊與全局變量定義

con_list列表保存連接的socket句柄;

out_list列表保存有數據要發送的socket句柄;

message_rddict字典保存接收的數據;

message_wtdict字典保存發送的數據。

圖7、數據處理模塊線程

數據處理模塊:接收設備的數據,按業務邏輯處理(本方案為發送升級數據包)

圖8、Tcp Socket線程

Tcp Socket線程不斷地監聽設備的Tcp Client連接,然後將接收的數據傳送給data proc線程處理;同時,將data pro線程的需要發送的數據,通過socket發送出去。

圖9、主線程

主線程就是建立兩個子線程。

接著、調試花絮

1、python2跟python3版本兼容性問題

比如在python2的線程庫為thread,而python3並不支持,為了兼容python2,其提供了_thread庫。

2、python數據類型問題

正常數據會保存於列表或字典中,然後由socket進行發送,但是socket的函數接口

sendall(bytes(xxxx)),接收bytes型的字節流,因此發送前,需要將list轉bytes,如bytes(xxxx)。

相反,bytes轉list為list(xxxx)。

最後、總結

經過幾天調試,發現python能夠被大家所接受是有其原因的:

1、語法簡單,沒有了C語言的指針與內存分配釋放問題,雖然剛開始用時有些彆扭;

2、代碼簡單,提供了豐富的庫支持,簡單地調用就實現了功能,這也是能快速完成的原因。

圖10、C語言

相關焦點

  • python socket實戰(二)
    這個在c語言編程中尤為常見。例如,有一個如下到結構體,python如何用socket進行通信傳遞該消息呢。下表是常見到python類型、字節和格式符號到對應表。阻塞,等待連接s.connect() 連接伺服器端,參數必須是元組格式例如:s.connect(('127,0.0.1',8009))s.recv(1024)  接收TCP數據,1024為一次數據接收的大小s.send(bytes)  發送TCP數據,python3發送數據的格式必須為bytes格式s.sendall()  完整發送數據,內部循環調用sendsocket.recv(bufsize
  • C語言:使用socket寫一個tcp客戶端
    #include <stdlib.h>#include <stdio.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h
  • Python入門基礎之socket多線程編程,TCP伺服器和客戶端通信
    在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。
  • python筆記28(TCP,UDP,socket協議)
    4、代碼部分:①介紹socket;②使用socket完成tcp協議的web通信;③使用socket完成udp協議的web通信。output read,recv:輸入input 能夠傳輸的數據沒有限制2、UDP協議1、無連接的,速度快2、可能會丟消息能夠傳輸的數據長度有限的,是根據數據傳輸設備設置有關(MTU)應用場景:TCP:文件的上傳,下載(郵件,網盤,緩存電影)UDP:即時通信(QQ,微信)3、OSI7層模型應用層 :http,https,ftp,smtp表示層會話層#應用層(開發角度,五層協議)--》代碼傳輸層,tcp
  • 自己動手用C語言寫一個伺服器和客戶端(TCP)
    如果想要自己寫一個伺服器和客戶端,我們需要掌握一定的網絡編程技術,個人認為,網絡編程中最關鍵的就是這個東西——socket(套接字)。socket(套接字):簡單來講,socket就是用於描述IP位址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。
  • python socket實戰(一)
    每周一07:22,準時為你充電最近一直在用python編寫socket
  • TCP Socket工作原理
    如果對此想更深入的了解細節,可以參考 Linux內核實現的socket structs (net/sock.h.)tcp連接有關的結構體信息(struct sock) ,從而以此來確定這個packet與哪個TCP 連接有關。
  • Python3 網絡編程|python|伺服器|應用程式|調用|tcp_網易訂閱
    高級別的網絡服務模塊 SocketServer, 它提供了伺服器中心類,可以簡化網絡伺服器的開發。  什麼是 Socket?  Socket又稱"套接字",應用程式通常通過"套接字"向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間可以通訊。
  • 簡單說說Python Socket編程步驟?
    所以,我們無需深入理解tcp/udp協議,socket已經為我們封裝好了,我們只需要遵循socket的規定去編程,寫出的程序自然就是遵循tcp/udp標準的。Python 提供了兩個基本的 socket 模塊。第一個是 Socket,它提供了標準的 BSD Sockets API。第二個是 SocketServer, 它提供了伺服器中心類,可以簡化網絡伺服器的開發。
  • 嵌入式+AI,嵌入式工程師的前景如何?
    拋卻那些把人繞來繞去的定義,簡單的說,嵌入式就是先設計硬體,在根據相關需求來編寫能在硬體上運行的代碼,這就是目前所謂的「智能硬體」。01 嵌入式工程師的分類嵌入式軟體開發具體可以分三類:1、嵌入式驅動工程師:編寫和移植各種晶片驅動,優化硬體設備驅動,得精通各種硬體接口協議、系統調度、信號量、鎖機制等等,開發難度最大。
  • 用Python使用C語言程序(Windows平臺)
    qianyan在機器學習中,很多時候我們需要Python和C的混合編程,最重要的原因是為了性能效率的提升: 解釋型語言一般比編譯型語言慢,一般提高性能的有效做法是,先做性能測試,找出性能瓶頸部分,然後把瓶頸部分在擴展中實現。本文的目標是在windows平臺下(使用pycharm),實現python調用C語言編寫的程序。
  • 《零基礎看得懂的C語言入門教程 》——(十三)socket服務端編寫
    一、學習目標目錄第一篇:(一)脫離學習誤區第二篇:(二)C語言沒那麼難簡單開發帶你了解流程第三篇:(三)輕輕鬆鬆理解第一個C語言程序第四篇:(四)語言的基本數據類型及變量+IT書籍2份喲~二、了解socket 套接字的使用方法打個預防針:聽不懂概念也會用的,現在不理解以後肯定會理解。
  • 如果C不行了,嵌入式編程是否應該用C+替代C語言!
    前言 幾十年來,嵌入式軟體工程師們一直在爭論是否應該使用C++替代C語言進行開發工作。 根據IEEE和github的市場調查顯示,微控制器製造商提供的軟體大部分都是由C語言編寫。
  • 十年資深嵌入式大神:教你真正好學的嵌入式開發學習路線
    Linux 是一個開源、免費的作業系統,主要應用於伺服器(網站伺服器、雲計算集群、DNS 等)和嵌入式,同時也被很多程式設計師用作個人作業系統。 1、嵌入式高級C語言 Linux系統 Linux Ubuntu作業系統安裝、使用、Linux常用命令、samba伺服器、SSH遠程登錄GCC編譯器、GDB調試器、VI編輯器 1、
  • python socket編程的理解
    編寫server的步驟第一步創建socket對象。調用socket構造函數。如:socket = socket.socket( family, type )family參數代表地址家族,可為AF_INET或AF_UNIX。
  • 從源碼看tcp三次握手(上)
    著名的TCP三次握手 前面已經介紹過常用套接字接口函數,也就是伺服器調用bind、listen 以及 accept 等待客戶端進行連接,而客戶端connect函數主動請求連接伺服器。下面是具體的過程:客戶端的協議棧向伺服器端發送了 SYN 包,並告訴伺服器端當前發送序列號 j,客戶端進入 SYNC_SENT 狀態;伺服器端的協議棧收到這個包之後,和客戶端進行 ACK 應答,應答的值為 j+1,表示對 SYN 包 j 的確認,同時伺服器也發送一個 SYN 包,告訴客戶端當前我的發送序列號為 k,伺服器端進入 SYNC_RCVD
  • 嵌入式系統高級C語言編程
    內容簡介  《嵌入式系統高級C語言編程》將主要介紹針對嵌入式系統的基於C語言的軟體項目開發的流程,較為複雜的c語言編程知識和技巧,編程風格和調試習慣
  • Linux C語言高級編程之Socket網絡編程!
    基於socket的一對一通信模型1、服務端:1)創建socket,使用socket函數;2)準備通信地址,使用結構體類型;3)綁定socket和通信地址,使用bind函數;4)進行通信,使用read/write函數;
  • 世界上第一個C語言編譯器是怎麼編寫的?它為什麼能夠用C語言編寫?
    不知道大家有沒有想過一個問題:C語言編譯器為什麼能夠用C語言編寫? 今天小編就帶大家一探究竟! 在C語言被用作系統程式語言之前,Tomphson已經使用B語言編寫過作業系統。可見在C語言實現以前,B語言已經可以投使用了。 因此第一個C語言編譯器的原型完全可能是用B語言或者混合B語言與PDP彙編語言編寫的。