模擬SIP終端向Freeswitch注冊用戶

1、簡介

使用go語言編寫一個程序,模擬SIP-T58終端在Freeswitch上注冊用戶

2、思路

  • 以客戶端向服務端Freeswitch發起REGISTER請求,告知服務器當前的聯系地址
  • 構造SIP REGISTER請求
  1. 創建UDP連接,連接到Freeswitch的5060端口
  2. 發送初始的REGISTER請求,不帶認證
  3. 接收服務器的響應,如果是401(不帶認證),那么需要提取nonce并重新發送帶有認證(Authorization)的REGISTER請求
  4. 處理服務器返回的響應,確認注冊成功

3、實現過程

  • 發送初始的REGISTER請求,此時沒有認證頭,服務器將會返回401,并且帶上WWW-Authenticate頭字段

  • 解析401響應,獲取nonce,重新構造REGISTER請求,包含Authorization頭,包含response的摘要
  • response = MD5( MD5(A1) ":" nonce ":" MD5(A2) )

    其中A1是 username:realm:password,A2是 METHOD:uri。

    例如,假設用戶1000的密碼是1234,realm是FreeSWITCH,那么A1就是1000:FreeSWITCH:1234,取其MD5哈希,然后與nonce以及A2的MD5哈希(對于REGISTER方法,A2是REGISTER:sip:192.168.0.31)結合,再進行一次MD5計算。

  • 接下來,構建Authorization頭部:

    Authorization: Digest username="1000", realm="FreeSWITCH", nonce="...", uri="sip:192.168.0.0", response="...", algorithm=MD5

  1. 創建UDP套接字,綁定到到本機地址
  2. 生成必要的SIP頭部字段,客戶端生成唯一的Call-ID,并且CSeq序號每次遞增
  3. 處理網絡通信,發送和接收UDP數據
  4. 解析服務器的響應,提取nonce等信息
  5. 計算response摘要,構造第二個REGISTER請求

4、如何解析服務器的響應

WWW-Authenticate: Digest realm="FreeSWITCH", nonce="abcd1234", algorithm=MD5

需要從該頭中提取realm和nonce的值。

處理這些字符串可能需要字符串分割和提取,或者使用正則表達式。

5、定義變量

freeswitchIP := 192.168.0.0

sipUser := "1000"

password := "123456"

localPort := 5061

創建UDP連接

serverAddr,err := net.ResolveUDPAddr("udp",freeswitchIP+":5061")

if err != nil{

? log.Fatal(err)

}

系統分配本機地址

localAddr,err := net.ResolveUDPAddr("udp",localhostIP+":0")

conn,err := net.DialUDP("udp",localAddr,serverAddr)

if err != nil{

? ? ? ? log.Fatal(err)

}

defer conn.Close()

生成Call-ID,CSeq,branch

callID := generateCallID()

cseq := 1

branch := generateBranch()//z9hG4bK + 隨機字符

生成初始的REGISTER請求

registerRequest := fmt.Sprintf(

"REGISTER sip:%s SIP/2.0\r\n"+

"Via:SIP/2.0/UDP %s:%d;branch=%s\r\n"+

"Max-Forwards:70\r\n"+

"From:<sip:%s@%s>;tag=%s\r\n"+

"To:<sip:%s@%s>\r\n"+

"Call-ID:%s\r\n"+

"CSeq:%d REGISTER"+

"Contact:<sip:%s@%s:%d>\r\n"+

"Expires:%d\r\n"+

"Context-Length:0\r\n\r\n",

freeswitchIP,localhostIP,localAddr.Port,branch,

sipUser,FreeswitchIP,generateTag(),

sipUser,freeswitchIP,

CallID,

cseq,

sipUser,localIP,localPort,

3600,

)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78302.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek實戰--LLM微調

1.為什么是微調 &#xff1f; 微調LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于預訓練好的大型語言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通過特定領域或任務的數據進一步訓練&#xff0c;使其適應具體需求的過程。它是將…

Docker與WSL2如何清理

文章目錄 Docker與WSL2如何清理一、docker占據磁盤空間核心原因分析1. WSL2 虛擬磁盤的動態擴展特性2. Docker 鏡像分層緩存與未清理資源 二、解決方案步驟 1&#xff1a;清理 Docker 未使用的資源步驟 2&#xff1a;手動壓縮 WSL2 虛擬磁盤1. 關閉 WSL2 和 Docker Desktop2. 定…

在 IDEA 中寫 Spark 程序:從入門到實踐

在大數據處理領域&#xff0c;Apache Spark 憑借其出色的性能和豐富的功能受到廣泛歡迎。而 IntelliJ IDEA 作為一款功能強大的 Java 集成開發環境&#xff0c;為編寫 Spark 程序提供了極大的便利。本文將詳細介紹如何在 IDEA 中搭建 Spark 開發環境并編寫運行 Spark 程序&…

Unity 使用 ADB 實時查看手機運行性能

Unity 使用 ADB 實時查看手機運行性能 前言操作步驟ADB工具下載ADB工具配置手機進入開發者模式并開啟USB調試使用ADB連接手機Unity打包設置使用Profiler實時查看性能情況優化建議 常見問題 前言 通過 ADB&#xff08;Android Debug Bridge&#xff09;連接安卓設備&#xff0c…

深入理解 HttpExchange_Java 中構建 HTTP 服務的基礎組件

1. 引言 1.1 Java 中的輕量級 HTTP 服務需求 隨著微服務、工具類應用和嵌入式系統的興起,開發者對輕量級 HTTP 服務的需求日益增長。相比引入龐大的框架(如 Spring Boot),使用 JDK 原生 API 構建 HTTP 服務成為一種快速、低依賴的替代方案。 JDK 提供了 com.sun.net.htt…

【RocketMQ NameServer】- NameServer 啟動源碼

文章目錄 1. 前言2. RocketMQ 通信架構3. NameServer 啟動流程3.1 創建 NameServerController3.2 啟動 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整體流程3.3.2 創建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…

【算法題】荷蘭國旗問題[力扣75題顏色分類] - JAVA

一、題目 二、文字解釋 1.1 前言 本題是經典的「荷蘭國旗問題」&#xff0c;由計算機科學家 Edsger W. Dijkstra 首先提出。如同圖中所示的荷蘭國旗&#xff0c;其由紅、白、藍三色水平排列組成。在算法領域&#xff0c;該問題可類比為將一個由特定的三種元素&#xff08;可抽…

MySQL數據操作全攻略:DML增刪改與DQL高級查詢實戰指南

知識點4【MySQL的DDL】 DDL&#xff1a;主要管理數據庫、表、列等操作。 庫→表&#xff08;二維&#xff09;→列&#xff08;一維&#xff09; 數據表的第一行是 列名稱 數據庫是由一張或多張表組成 我們先學習在數據庫中創建數據表 0、常見的數據類型&#xff1a; 1、…

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言 賽時想到了差分約束&#xff0c;隨手寫了個 SPFA 結果掛的很慘……還是太菜了&#xff0c;賽后 Bellman-Ford 又調了半天。 題目大意 給定整數 N , M N,M N,M 和長度為 M M M 的三個整數序列 L ( L 1 , L 2 , … , L M ) , R ( R 1 , R 2 , … , R M ) , S ( S 1…

如何基于HAL庫進行STM32開發

一、初識HAL庫 STM32 開發中常說的 HAL 庫開發&#xff0c;指的是利用 HAL 庫固件包里封裝好的 C 語言編寫的驅動文件&#xff0c;來實現對 STM32 內部和外圍設備的控制。但只有 HAL 庫還不能直接驅動一個 STM32 的芯片&#xff0c;其它的組件已經由 ARM 與眾多芯片硬件、軟件廠…

Qt:(創建項目)

目錄 1. 使?QtCreator新建項? 1.1 新建項? 1.2 選擇項?模板 1.3 選擇項?路徑 1.4 選擇構建系統 1.5 填寫類信息設置界? ?編輯 1.6 選擇語?和翻譯?件 1.6 選擇Qt套件 1.7 選擇版本控制系統 1.8 最終效果 1. 使?QtCreator新建項? 1.1 新建項? 打開Qt…

WPF之Slider控件詳解

文章目錄 1. 概述2. 基本屬性2.1 值范圍屬性2.2 滑動步長屬性2.3 刻度顯示屬性2.4 方向屬性2.5 選擇范圍屬性 3. 事件處理3.1 值變化事件3.2 滑塊拖動事件 4. 樣式和模板自定義4.1 基本樣式設置4.2 控件模板自定義 5. 數據綁定5.1 綁定到ViewModel5.2 同步多個控件 6. 實際應用…

mysql索引及數據庫引擎

順序io&#xff08;不需要每次都磁盤尋址&#xff0c;效率高&#xff09;&#xff0c;隨機io&#xff08;需要每次都磁盤尋址&#xff0c;效率低&#xff09; 如何正確的創建合適的索引&#xff1f; 索引是一種分散存儲的數據結構 磁盤io特性&#xff1a;每次交互是以頁為單位&…

網絡安全:sql注入練習靶場——sqli_labs安裝保姆級教程

網絡安全&#xff1a;sql注入練習靶場——sqli_labs安裝保姆級教程 前言 sqli-labs靶場是一個開源的sql注入練習的綜合靶場&#xff0c;包含大部分sql注入漏洞以及注入方式 網絡安全學習者可以通過在sqli-labs靶場練習提升對sql注入的理解&#xff0c;以及學習各種繞過姿勢。…

平臺介紹-開放API接口-鑒權

平臺的理念是一個組織內部只建一套系統。但是現實情況是&#xff0c;組織內部已經建立了很多系統&#xff0c;是不能一次性替代的&#xff0c;只能先搭起平臺&#xff0c;然后逐步開始替換。這樣就不可避免的存在其他系統和平臺進行交互的問題。 平臺為此設計了開放API接口。其…

多端定制系統開發:打造高效全平臺覆蓋的APP解決方案

在移動互聯網時代&#xff0c;用戶需求日益多樣化&#xff0c;企業若想觸達更廣泛的受眾&#xff0c;僅靠單一平臺的應用已遠遠不夠。無論是iOS、Android、Web端&#xff0c;還是智能手表、車載設備等新興終端&#xff0c;多端適配已成為企業數字化轉型的剛需。多端定制系統開發…

Linux電源管理(5)_Hibernate和Sleep功能介紹

原文&#xff1a;Linux電源管理(5)_Hibernate和Sleep功能介紹 1. 前言 Hibernate和Sleep兩個功能是Linux PM的核心功能&#xff0c;它們的目的是類似的&#xff1a;暫停使用——>保存上下文——>關閉系統以節電>恢復系統——>恢復上下文——>繼續使用。 本文…

Spring 命名空間注入:p、c 與 .util 的深度解析

在 Spring 框架的開發過程中&#xff0c;XML 配置是一種常見且強大的方式來管理 Bean。為了讓配置更加簡潔、易讀&#xff0c;Spring 提供了多種命名空間注入的方法&#xff0c;其中 p 命名空間注入、c 命名空間注入和 .util 命名空間尤為重要。本文將詳細介紹這三種命名空間的…

RUST變量學習筆記

1&#xff0c;作用域概念 捕獲環境 2&#xff0c;所有權概念 Rust則是通過所有權和借用來保證內存安全。很多人不理解為啥說Rust是內存安全的&#xff0c;其實就是在默認情況下&#xff0c;你是寫不出內存不安全的代碼的。 Rust的所有權并不難理解&#xff0c;它有且只有如下…

探索 Spring AI 的 ChatClient API:構建智能對話應用的利器

探索 Spring AI 的 ChatClient API&#xff1a;構建智能對話應用的利器 前言 在當今人工智能蓬勃發展的時代&#xff0c;智能對話系統成為了眾多應用的核心組成部分。無論是客服機器人、智能助手還是聊天應用&#xff0c;都離不開高效、靈活的對話處理能力。Spring AI 作為 S…