Files
onvif-go/device_wifi.go
T
ProtoTess 4f3e2a6df0 feat: Add device storage and WiFi management functionalities
- Implemented storage configuration management in device_storage.go:
  - GetStorageConfigurations
  - GetStorageConfiguration
  - CreateStorageConfiguration
  - SetStorageConfiguration
  - DeleteStorageConfiguration
  - SetHashingAlgorithm

- Added unit tests for storage configuration operations in device_storage_test.go.

- Implemented WiFi management functionalities in device_wifi.go:
  - GetDot11Capabilities
  - GetDot11Status
  - GetDot1XConfiguration
  - GetDot1XConfigurations
  - SetDot1XConfiguration
  - CreateDot1XConfiguration
  - DeleteDot1XConfiguration
  - ScanAvailableDot11Networks

- Added unit tests for WiFi management operations in device_wifi_test.go.

- Updated types.go to include new structures for geo location and access policy.
2025-12-01 00:05:35 +00:00

251 lines
8.2 KiB
Go

package onvif
import (
"context"
"encoding/xml"
"fmt"
"github.com/0x524a/onvif-go/internal/soap"
)
// GetDot11Capabilities retrieves the 802.11 capabilities of the device.
//
// ONVIF Specification: GetDot11Capabilities operation
func (c *Client) GetDot11Capabilities(ctx context.Context) (*Dot11Capabilities, error) {
type GetDot11CapabilitiesBody struct {
XMLName xml.Name `xml:"tds:GetDot11Capabilities"`
Xmlns string `xml:"xmlns:tds,attr"`
}
type GetDot11CapabilitiesResponse struct {
XMLName xml.Name `xml:"GetDot11CapabilitiesResponse"`
Capabilities *Dot11Capabilities `xml:"Capabilities"`
}
request := GetDot11CapabilitiesBody{
Xmlns: deviceNamespace,
}
var response GetDot11CapabilitiesResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("GetDot11Capabilities failed: %w", err)
}
return response.Capabilities, nil
}
// GetDot11Status retrieves the current 802.11 status of the device.
//
// ONVIF Specification: GetDot11Status operation
func (c *Client) GetDot11Status(ctx context.Context, interfaceToken string) (*Dot11Status, error) {
type GetDot11StatusBody struct {
XMLName xml.Name `xml:"tds:GetDot11Status"`
Xmlns string `xml:"xmlns:tds,attr"`
InterfaceToken string `xml:"tds:InterfaceToken"`
}
type GetDot11StatusResponse struct {
XMLName xml.Name `xml:"GetDot11StatusResponse"`
Status *Dot11Status `xml:"Status"`
}
request := GetDot11StatusBody{
Xmlns: deviceNamespace,
InterfaceToken: interfaceToken,
}
var response GetDot11StatusResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("GetDot11Status failed: %w", err)
}
return response.Status, nil
}
// GetDot1XConfiguration retrieves a specific 802.1X configuration.
//
// ONVIF Specification: GetDot1XConfiguration operation
func (c *Client) GetDot1XConfiguration(ctx context.Context, configToken string) (*Dot1XConfiguration, error) {
type GetDot1XConfigurationBody struct {
XMLName xml.Name `xml:"tds:GetDot1XConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
Dot1XConfigurationToken string `xml:"tds:Dot1XConfigurationToken"`
}
type GetDot1XConfigurationResponse struct {
XMLName xml.Name `xml:"GetDot1XConfigurationResponse"`
Dot1XConfiguration *Dot1XConfiguration `xml:"Dot1XConfiguration"`
}
request := GetDot1XConfigurationBody{
Xmlns: deviceNamespace,
Dot1XConfigurationToken: configToken,
}
var response GetDot1XConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("GetDot1XConfiguration failed: %w", err)
}
return response.Dot1XConfiguration, nil
}
// GetDot1XConfigurations retrieves all 802.1X configurations.
//
// ONVIF Specification: GetDot1XConfigurations operation
func (c *Client) GetDot1XConfigurations(ctx context.Context) ([]*Dot1XConfiguration, error) {
type GetDot1XConfigurationsBody struct {
XMLName xml.Name `xml:"tds:GetDot1XConfigurations"`
Xmlns string `xml:"xmlns:tds,attr"`
}
type GetDot1XConfigurationsResponse struct {
XMLName xml.Name `xml:"GetDot1XConfigurationsResponse"`
Dot1XConfiguration []*Dot1XConfiguration `xml:"Dot1XConfiguration"`
}
request := GetDot1XConfigurationsBody{
Xmlns: deviceNamespace,
}
var response GetDot1XConfigurationsResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("GetDot1XConfigurations failed: %w", err)
}
return response.Dot1XConfiguration, nil
}
// SetDot1XConfiguration updates an existing 802.1X configuration.
//
// ONVIF Specification: SetDot1XConfiguration operation
func (c *Client) SetDot1XConfiguration(ctx context.Context, config *Dot1XConfiguration) error {
type SetDot1XConfigurationBody struct {
XMLName xml.Name `xml:"tds:SetDot1XConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
Dot1XConfiguration *Dot1XConfiguration `xml:"tds:Dot1XConfiguration"`
}
type SetDot1XConfigurationResponse struct {
XMLName xml.Name `xml:"SetDot1XConfigurationResponse"`
}
request := SetDot1XConfigurationBody{
Xmlns: deviceNamespace,
Dot1XConfiguration: config,
}
var response SetDot1XConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return fmt.Errorf("SetDot1XConfiguration failed: %w", err)
}
return nil
}
// CreateDot1XConfiguration creates a new 802.1X configuration.
//
// ONVIF Specification: CreateDot1XConfiguration operation
func (c *Client) CreateDot1XConfiguration(ctx context.Context, config *Dot1XConfiguration) error {
type CreateDot1XConfigurationBody struct {
XMLName xml.Name `xml:"tds:CreateDot1XConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
Dot1XConfiguration *Dot1XConfiguration `xml:"tds:Dot1XConfiguration"`
}
type CreateDot1XConfigurationResponse struct {
XMLName xml.Name `xml:"CreateDot1XConfigurationResponse"`
}
request := CreateDot1XConfigurationBody{
Xmlns: deviceNamespace,
Dot1XConfiguration: config,
}
var response CreateDot1XConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return fmt.Errorf("CreateDot1XConfiguration failed: %w", err)
}
return nil
}
// DeleteDot1XConfiguration deletes a 802.1X configuration.
//
// ONVIF Specification: DeleteDot1XConfiguration operation
func (c *Client) DeleteDot1XConfiguration(ctx context.Context, configToken string) error {
type DeleteDot1XConfigurationBody struct {
XMLName xml.Name `xml:"tds:DeleteDot1XConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
Dot1XConfigurationToken string `xml:"tds:Dot1XConfigurationToken"`
}
type DeleteDot1XConfigurationResponse struct {
XMLName xml.Name `xml:"DeleteDot1XConfigurationResponse"`
}
request := DeleteDot1XConfigurationBody{
Xmlns: deviceNamespace,
Dot1XConfigurationToken: configToken,
}
var response DeleteDot1XConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return fmt.Errorf("DeleteDot1XConfiguration failed: %w", err)
}
return nil
}
// ScanAvailableDot11Networks scans for available 802.11 wireless networks.
//
// ONVIF Specification: ScanAvailableDot11Networks operation
func (c *Client) ScanAvailableDot11Networks(ctx context.Context, interfaceToken string) ([]*Dot11AvailableNetworks, error) {
type ScanAvailableDot11NetworksBody struct {
XMLName xml.Name `xml:"tds:ScanAvailableDot11Networks"`
Xmlns string `xml:"xmlns:tds,attr"`
InterfaceToken string `xml:"tds:InterfaceToken"`
}
type ScanAvailableDot11NetworksResponse struct {
XMLName xml.Name `xml:"ScanAvailableDot11NetworksResponse"`
Networks []*Dot11AvailableNetworks `xml:"Networks"`
}
request := ScanAvailableDot11NetworksBody{
Xmlns: deviceNamespace,
InterfaceToken: interfaceToken,
}
var response ScanAvailableDot11NetworksResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("ScanAvailableDot11Networks failed: %w", err)
}
return response.Networks, nil
}