a Go library for reading iridium short data bursts
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.1 KiB

  1. package main
  2. import (
  3. "git.binarythought.com/cdramey/sdb"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "flag"
  8. )
  9. func main() {
  10. flags := flag.NewFlagSet("sdb", flag.ExitOnError)
  11. flags.SetOutput(os.Stdout)
  12. flags.Usage = func() {
  13. fmt.Fprintf(flags.Output(),
  14. "Usage: %s [OPTION] <files> ...\nOptions:\n",
  15. os.Args[0])
  16. flags.PrintDefaults()
  17. }
  18. plonly := flags.Bool("payload", false, "only return the payload")
  19. flags.Parse(os.Args[1:])
  20. if flags.NArg() < 1 {
  21. fmt.Fprintf(os.Stderr, "files parameter cannot be empty\n")
  22. os.Exit(1)
  23. }
  24. for _, fn := range flags.Args() {
  25. raw, err := ioutil.ReadFile(fn)
  26. if err != nil {
  27. fmt.Fprintf(os.Stderr,
  28. "error reading \"%s\": %s\n",
  29. fn, err.Error())
  30. continue
  31. }
  32. data, err := sdb.ParseSDB(raw)
  33. if err != nil {
  34. fmt.Fprintf(os.Stderr,
  35. "%s\n", err.Error())
  36. continue
  37. }
  38. if *plonly {
  39. for _, i := range data.Elements {
  40. switch v := i.(type) {
  41. case sdb.MOPayload:
  42. os.Stdout.Write(v.Payload)
  43. }
  44. }
  45. } else {
  46. fmt.Printf("Protocol Revision: %d\n",
  47. data.ProtocolRevision)
  48. fmt.Printf("Message Length: %d\n",
  49. data.Length)
  50. for c, i := range data.Elements {
  51. if c > 0 {
  52. fmt.Println()
  53. }
  54. switch v := i.(type) {
  55. case sdb.MOHeader:
  56. fmt.Printf("\tMO Header IEI: %d\n",
  57. v.IEI)
  58. fmt.Printf("\tMO Header Length: %d\n",
  59. v.Length)
  60. fmt.Printf("\tMO Header CDR Reference: %d\n",
  61. v.CDRReference)
  62. fmt.Printf("\tMO Header IMEI: %s\n",
  63. v.IMEI)
  64. fmt.Printf("\tMO Header Status: %s (%d)\n",
  65. v.StatusString(), v.Status)
  66. fmt.Printf("\tMO Header MOMSN: %d\n",
  67. v.MOMSN)
  68. fmt.Printf("\tMO Header MTMSN: %d\n",
  69. v.MTMSN)
  70. fmt.Printf("\tMO Header Session Time: %s\n",
  71. v.SessionTime().String())
  72. case sdb.MOPayload:
  73. fmt.Printf("\tMO Payload IEI: %d\n",
  74. v.IEI)
  75. fmt.Printf("\tMO Payload Length: %d\n",
  76. v.Length)
  77. case sdb.MOConfirmation:
  78. fmt.Printf("\tMO Confirmation IEI: %d\n",
  79. v.IEI)
  80. fmt.Printf("\tMO Confirmation Length: %d\n",
  81. v.Length)
  82. fmt.Printf("\tMO Confirmation Status: %d\n",
  83. v.Status)
  84. }
  85. }
  86. }
  87. }
  88. }